package com.cplatform.movie.back.utils;


import java.sql.SQLException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


import com.cplatform.movie.back.model.SessionUser;
import com.cplatform.movie.back.sys.entity.SysRegion;
import com.cplatform.movie.back.sys.service.SysRegionService;

/**
 * 权限服务类.
 * <p>
 * Copyright: Copyright (c) 2014-7-24 上午09:54:45
 * <p>
 * Company: 北京宽连十方数字技术有限公司
 * <p>
 * @author liuyangsz@c-platform.com
 * @version 1.0.0
 */

@Service
public class AccessService {
	
	private final static Logger log = Logger.getLogger(AccessService.class);
	
	@Autowired
	private SysRegionService service;
	
	
	private final Integer level = 1 ;
	private final Integer num = 2 ;
	/**
	 * 只针对于region_code只能存一个区域code的，
	 * 无逗号。
	 * @param sql
	 * @return
	 */
	public String accessControl(String sql){
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		SessionUser user = (SessionUser) request.getSession().getAttribute(SessionUser.SESSION_USER_KEY);
		List<SysRegion> list = null;
		List<SysRegion> regions = null;
		StringBuffer buffer =new StringBuffer(); 
		if (user == null) {// 没有登录,不会返回任何数据
			return " and  1=2 ";
		}
		// 如果是超级管理员，则没有限制
		if (user.isSuperAdmin()) {
			return "";
		}
		//如果是电商基地单位,则没有限制
		if(user.getSysUnit().getUnitType()== 1){
			return "";
		}
		//省单位
		if(user.getSysUnit().getUnitType() ==2){
			
			buffer.append(user.getSysUnit().getAreaCode());
            try {
	            list = service.findRegions(user.getSysUnit().getAreaCode(),level); //这里全部放地市。
	            for(SysRegion s:list){
					regions = service.findRegions(s.getRegionCode(),num); //这里全部放地市下面的区域。
					for(SysRegion region: regions){
						buffer.append(","+region.getRegionCode());
					}
					buffer.append(","+s.getRegionCode());
				}
            }
            catch (SQLException e) {
            	log.error("权限过滤查询区域异常", e);
            }
			
			return " and " +sql+" in ("+buffer.toString()+") ";
		}
		try {
			buffer.append(user.getSysUnit().getAreaCode());
	        list = service.findRegions(user.getSysUnit().getAreaCode(),num);
	        for(SysRegion s:list){
				buffer.append(","+s.getRegionCode());
			}
        }
        catch (SQLException e) {
        	log.error("权限过滤查询区域异常", e);
        }
        return " and " +sql+" in ("+buffer.toString()+") ";//地市单位
	}
	
	/**
	 * 针对于区域存在多个的，有逗号的。
	 * @param sql 注意,这里的sql是固定长度的字符串。
	 * @return
	 * @throws Exception
	 */
	public String accessFilter(String sql) throws Exception{
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
		SessionUser user = (SessionUser) request.getSession().getAttribute(SessionUser.SESSION_USER_KEY);
		List<SysRegion> list = null;
		StringBuffer buffer =new StringBuffer(); 
		if (user == null) {// 没有登录,不会返回任何数据
			return " and  1=2 ";
		}
		// 如果是超级管理员，则没有限制
		if (user.isSuperAdmin()) {
			return "";
		}
		//如果是电商基地单位,则没有限制
		if(user.getSysUnit().getUnitType()== 1){
			return "";
		}
		buffer.append(" and ( "+sql+" like ");
		if(user.getSysUnit().getUnitType() == 2){//省单位
			list = service.findRegions(user.getSysUnit().getAreaCode(),level); //这里全部放省下面的地市。
			buffer.append(" '%").append(user.getSysUnit().getAreaCode()).append("%' or "+sql+" like");
			for (SysRegion region : list) {
				buffer.append(" '%").append(region.getRegionCode()).append("%' or "+sql+" like");
			}
			return buffer.toString().subSequence(0, buffer.toString().length() - 27).toString()+" )" ;
		}
		buffer.append( " '%"+user.getSysUnit().getAreaCode()+"%' ");   //市单位了。
		return buffer.toString()+" )";
	}
}
